package com.ylxin.webflux.service.impl;

import com.ylxin.webflux.pojo.User;
import com.ylxin.webflux.service.UserService;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author 29048
 * @version V1.0
 * @Project webflux01
 * @Package com.ylxin.webflux.service.impl
 * @Description: Create by 杨立新 @Date 2022/9/22 16:04
 */
@Service
public class UserServiceImpl implements UserService {

    //创建 map 集合存储数据,不是直接从数据库中取数据出来。
    private final Map<Integer,User> users = new HashMap<>();

    public UserServiceImpl() {
        this.users.put(1,new User("liuyi","female",20));
        this.users.put(2,new User("孙杨","male",22));
        this.users.put(3,new User("jack","female",23));
    }

    /**
     * 根据 id 查询
     * @param id
     * @return
     */
    @Override
    public Mono<User> getUserById(int id) {
        return Mono.justOrEmpty(this.users.get(id));
    }

    /**
     * 查询多个用户
     * @return
     */
    @Override
    public Flux<User> getAllUser() {
        //map.values():Collection<V>  ,获取所有的值，用来遍历。keySet():Set<K> ,    entrySet():Set<Map.Entry<K,V>>
        return Flux.fromIterable(this.users.values());
    }

    @Override
    public Flux<User> getUsersStream() {
        //doOnNext在下一条数据处理之前先执行
        return Flux.fromIterable(this.users.values()).doOnNext(user -> {
            try {
                //模拟数据的处理需要消耗时间，一条一条的获取过来的。
                //正常是状态码200就结束了，返回一个数据的时候不着急，慢慢的返回慢慢的接收，并没有结束。类似于长连接的方式。
                // SpringMVC实现不了，必须通过响应式编程可以现实。
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
    }

    /**
     * 添加用户
     * @param userMono
     * @return
     */
    @Override
    public Mono<Void> saveUserInfo(Mono<User> userMono) {
        return userMono.doOnNext(person -> {
            //向 map 集合中放值
            int id = users.size() + 1;
            users.put(id,person);
        }).thenEmpty(Mono.empty());
    }

}
